package gui;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Cursor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.print.PrinterException;
import java.net.URL;
import java.text.MessageFormat;
import javax.swing.*;

import controller.Controller;


/**
 * Fenetre principale de l'application
 * 
 * @author			Christos Kornaros, Grégory Moinat, Nicolas Muller
 * @version			1.0, 02.04.2008
 * Fichier :		JCodeView.java
 * Remarque(s) :	-
 * Compilateur : 	jdk1.6.0_02
*/ 
public class JCodeView extends JFrame {
	
	private String applicationName;
	
	private static final long serialVersionUID = 1;
	
	// Fixe la taille minimale de la fenêtre 
	private static final Dimension minimumWindowsize = new Dimension(500, 200);
	
	// Le controlleur faisant le lien avec les routines
	private Controller controller = new Controller(this);
	
	// Layout principal de la fenetre
	private BorderLayout layout;
	
	// Panneau contenant les elements
	private JPanel contentPanel;
	
	// Layout du panneau
	private BorderLayout contentLayout;
	
	// Touche modificatrice de raccourci (selon OS)
	private int modifierKey;
	
	// Elements du menu
	private JMenuBar mnuMenuBar;
	// Menu fichier
	private JMenu mnuFile;
	private JMenuItem mnuFileNew;
	private JSeparator sepMenuFile1;
	private JMenuItem mnuFileOpen;
	private JMenuItem mnuFileClose;
	private JSeparator sepMenuFile2;
	private JMenuItem mnuFileSave;
	private JMenuItem mnuFileSaveAs;
	private JSeparator sepMenuFile3;
	private JMenuItem mnuFilePrint;
	private JSeparator sepMenuFile4;
	private JMenuItem mnuFileQuit;
	// Menu Edition
	private JMenu mnuEdit;
	private JMenuItem mnuEditUndo;
	private JMenuItem mnuEditRedo;
	private JSeparator sepMenuEdit1;
	private JMenuItem mnuEditCut;
	private JMenuItem mnuEditCopy;
	private JMenuItem mnuEditPaste;
	private JSeparator sepMenuEdit2;
	private JMenuItem mnuEditSelectAll;
	private  JSeparator sepMenuEdit3;
	private JMenuItem mnuEditPreferences;
    // Menu Aide
	private JMenu mnuHelp;
	private JMenuItem mnuHelpAbout;
	
    // Barre d'outils
	private JToolBar toolBar;
	private JButton cmdNew;
	private JButton cmdOuvrir;
	private JButton cmdSave;
	private JButton cmdSaveAs;
	private JButton cmdPrint;
	private JSeparator sepToolBar1;
	private JButton cmdCut;
	private JButton cmdCopy;
	private JButton cmdPaste;
	private JButton cmdSelectAll;
	private JSeparator sepToolBar2;
	private JButton cmdQuit;
    
    // Zone d'edition
	private final Dimension scrollPaneSize = new Dimension(600, 700); // taille desiree pour la zone d'edition
	private JScrollPane scrollPane;
    private JColoredTextZone txtEditorZone;	
	
    // Barre d'etat
    private JPanel statusPanel;
    
    // Pour savoir si on est sur Mac OS X (certains menu seront implantés differement si c'est le cas)
    private boolean macOSX;
    
    // Textes des tooltips
    private final String lblToolTipNew = "Nouveau document";
    private final String lblToolTipOpen = "Ouvrir...";
    private final String lblToolTipSave = "Enregistrer";
    private final String lblToolTipSaveAs = "Enregistrer sous...";
    private final String lblToolTipPrint = "Imprimer...";
    private final String lblToolTipQuit = "Quitter C.O.D.E.";
    private final String lblToolTipCut = "Couper";
    private final String lblToolTipCopy = "Copier";
    private final String lblToolTipPaste = "Coller";
    private final String lblToolTipSelectAll = "Tout sélectionner";
    
    // Constantes pour le choix des fenetres de confirmation
    private final String save = "Enregistrer";
    private final String notSave = "Ne Pas Enregistrer";
    
    /**
    * Constructeur qui construit toute la fenêtre et ses composants
    *
    * @param name Le titre de la fenetre
    */   
	public JCodeView (String name) {
		
		// On verifie si on est sur Mac OS X
		macOSX = System.getProperty("os.name").toLowerCase().startsWith("mac os x");
		
		applicationName = name;
		setTitle(applicationName + " - Nouveau document");
		setMinimumSize(minimumWindowsize);
				
		// On determine la touche modificatrice de raccourci selon l'OS
		if (System.getProperty("os.name").startsWith("Mac"))
			modifierKey = InputEvent.META_MASK;
		else
			modifierKey = InputEvent.CTRL_MASK;
		
		// Creation du menu
			createMenu();
		
		// Mise en place du layout
		layout = new BorderLayout();
		getContentPane().setLayout(layout);
		
		// Mise en place du panneau
		contentPanel = new JPanel();
		contentLayout = new BorderLayout();
		contentPanel.setLayout(contentLayout);
		getContentPane().add(contentPanel, BorderLayout.CENTER);
		contentPanel.setVisible(true);
		
		
		// Ajout de la barre d'outils
		createToolBar();
		
		// Ajout de la zone d'edition
		scrollPane = new JScrollPane();
		scrollPane.setPreferredSize(scrollPaneSize);
		contentPanel.add(scrollPane, BorderLayout.CENTER);
		txtEditorZone = new JColoredTextZone();
		scrollPane.setViewportView(txtEditorZone);
		
		// Ajout de la barre d'etat
		statusPanel = new JPanel();
		getContentPane().add(statusPanel, BorderLayout.SOUTH);
		pack();
		
		// Lecture des préférences
		controller.readAndApplyPrefs();

		// La fermeture de la fenêtre n'entraine pas forcément la fermeture
		// En effet, si un document non sauvé est ouvert, un message de sauvegarde
		// apparait. Si l'utilisateur clique sur annuler, la fenetre ne doit 
		// pas se fermer. L'action associée à la fermeture de la fenetre est
		// est dans l'instruction addWindowListener dans la méthode
		// setActions();
		setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
		
		// Action du menu Fichier/Nouveau
		mnuFileNew.addActionListener(new ActionListener()
			{ public void actionPerformed (ActionEvent e)
				{
				// Demander de sauver si le fichier a été modifié
				if (userChoice().equals(notSave) || !controller.fileModification(txtEditorZone.getText())) {
					controller.closeFile();
					controller.newFile();
					
					// Reset complet du manager pour répeter/annuler
					setWorkspaceActive(false);
					setWorkspaceActive(true);
					txtEditorZone.getCodeDocument().getUndoManager().discardAllEdits();

					
					// On vide la zone de texte
					txtEditorZone.setText("");
						
					// Si aucun fichier n'était ouvert, on réactive la zone
					if (txtEditorZone.getBackground().equals(Color.GRAY))
						setWorkspaceActive(true);
							
						// Changer le titre de la fenêtre en conséquence
						setTitle(applicationName + " - Nouveau Document");
					}
				}
			}
		
		);
		
		// Action du menu Fichier/Ouvrir
		mnuFileOpen.addActionListener(new ActionListener()
			{ public void actionPerformed (ActionEvent e)
				{
				//
				// Demander de sauver si le fichier a été modifié
				if (userChoice().equals(notSave) || !controller.fileModification(txtEditorZone.getText())) {
					// Affichage de la boite d'ouverture et lecture du chemin
					String path = JFileDialogBox.FileOpenBox(txtEditorZone);				
					// On vérifie que l'utilisateur n'a pas cliqué sur annuler
					if (path != null) {

						// On met le curseur d'attente
						setCursor(new Cursor(Cursor.WAIT_CURSOR));
						txtEditorZone.setCursor(new Cursor(Cursor.WAIT_CURSOR));
						// Ouverture du fichier
						controller.openFile(txtEditorZone, path);
						// Reset complet du manager pour répeter/annuler
						txtEditorZone.getCodeDocument().getUndoManager().discardAllEdits();
						
						// Si aucun fichier n'était ouvert, on réactive la zone
						if (txtEditorZone.getBackground().equals(Color.GRAY))
							setWorkspaceActive(true);
						
						// Changer le titre de la fenêtre en conséquence
						setTitle(applicationName + " - " + controller.getPathOfFile());
						// On remet le curseur normal
						setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
						txtEditorZone.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
						}
					}
				//
				}
			}
		);
		
		// Action du menu Fichier/Fermer
		mnuFileClose.addActionListener(new ActionListener()
		{ public void actionPerformed (ActionEvent e)
			{
				// Demander de sauver si le fichier a été modifié
				if (userChoice().equals(notSave) || !controller.fileModification(txtEditorZone.getText())) {
					controller.closeFile();	
					setWorkspaceActive(false);
					
					// Changer le tite de la fenêtre en conséquence
					setTitle(applicationName + " - Pas de document ouvert");
				}
			}
		}
		);
		
		// Action du menu Fichier/Enregistrer
		mnuFileSave.addActionListener(new ActionListener()
		{ public void actionPerformed (ActionEvent e)
			{				
				// On verifie si le fichier existe déjà
				if (controller.getPathOfFile() != "") {
					controller.saveFile();
					// Changer le tite de la fenêtre en conséquence
					setTitle(applicationName + " - " + controller.getPathOfFile());
				}
				else
					mnuFileSaveAs.doClick();
			}
		}
		);	
	
		// Action du menu Fichier/Enregistrer Sous...
		mnuFileSaveAs.addActionListener(new ActionListener()
		{ public void actionPerformed (ActionEvent e)
			{
				// Affichage de la boite de sauvegarde et lecture du chemin
				String path = JFileDialogBox.FileSaveBox(txtEditorZone);
				
				// On vérifie que l'utilisateur n'a pas cliqué sur annuler
				if (path != null) {
					// Ouvre une boîte de dialogue pour spécifier le path
					controller.saveFileAs(path);
					// Changer le tite de la fenêtre en conséquence
					setTitle(applicationName + " - " + controller.getPathOfFile());
				}
			}
		}
		);	
		
		// Action du menu Fichier/Imprimer
		mnuFilePrint.addActionListener(new ActionListener()
			{ public void actionPerformed (ActionEvent e)
				{
					try {
						txtEditorZone.print(null, new MessageFormat("Page - {0}"));
					} catch (PrinterException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}
				};
			});

		// Action du menu Fichier/Quitter
		mnuFileQuit.addActionListener(new ActionListener()
			{ public void actionPerformed (ActionEvent e)
				{
					// Demander de sauver si le fichier a été modifié
					if (userChoice().equals(notSave) || !controller.fileModification(txtEditorZone.getText())) {
						controller.writePrefs();
						System.exit(0);
					}
				}
			});
		
		// Action du menu Edition/Annuler
		mnuEditUndo.addActionListener(new ActionListener()
			{ public void actionPerformed (ActionEvent e)
				{
					if (txtEditorZone.getCodeDocument().getUndoManager().canUndo()) {
						txtEditorZone.getCodeDocument().getUndoManager().undo();
						txtEditorZone.getCodeDocument().reScan();
					}
				}
			});
		
		// Action du menu Edition/Refaire
		mnuEditRedo.addActionListener(new ActionListener()
			{ public void actionPerformed (ActionEvent e)
				{
					if (txtEditorZone.getCodeDocument().getUndoManager().canRedo()) {
						txtEditorZone.getCodeDocument().getUndoManager().redo();
						txtEditorZone.getCodeDocument().reScan();
					}
				}
			});
		// Action du menu Edition/Couper
		mnuEditCut.addActionListener(new ActionListener()
		{ public void actionPerformed (ActionEvent e)
			{
				txtEditorZone.cut();
			}
		}
		);
		
		// Action du menu Edition/Copier
		mnuEditCopy.addActionListener(new ActionListener()
		{ public void actionPerformed (ActionEvent e)
			{
				txtEditorZone.copy();
			}
		}
		);
		
		// Action du menu Edition/Coller
		mnuEditPaste.addActionListener(new ActionListener()
		{ public void actionPerformed (ActionEvent e)
			{
				txtEditorZone.paste();
			}
		}
		);
		
		// Action du menu Edition/Tout selectionner
		mnuEditSelectAll.addActionListener(new ActionListener()
		{ public void actionPerformed (ActionEvent e)
			{
				txtEditorZone.selectAll();
			}
		}
		);
		
		// Action du menu Edition/Preferences
		mnuEditPreferences.addActionListener(new ActionListener()
		{ public void actionPerformed (ActionEvent e)
			{
				JAppOptions optionsPane = new JAppOptions(JCodeView.this, controller);
				optionsPane.setVisible(true);
			}
		}
		);
		
		// Action du menu Aide/A propos de Code...
		mnuHelpAbout.addActionListener(new ActionListener()
		{ public void actionPerformed (ActionEvent e)
			{
				JAboutBox aboutBox = new JAboutBox(JCodeView.this);
				aboutBox.setVisible(true);
			}
		}
		);
		
		
		// Action du bouton Nouveau
		cmdNew.addActionListener(new ActionListener()
			{ public void actionPerformed (ActionEvent e)
				{mnuFileNew.doClick();}
			}
		);
		
		// Action du bouton Ouvrir
		cmdOuvrir.addActionListener(new ActionListener()
			{ public void actionPerformed (ActionEvent e)
				{mnuFileOpen.doClick();}
			}
		);
		
		// Action du bouton Enregistrer
		cmdSave.addActionListener(new ActionListener()
			{ public void actionPerformed (ActionEvent e)
				{mnuFileSave.doClick();}
			}
		);

		// Action du bouton EnregistrerSous
		cmdSaveAs.addActionListener(new ActionListener()
			{ public void actionPerformed (ActionEvent e)
				{mnuFileSaveAs.doClick();}
			}
		);
		
		// Action du bouton Imprimer
		cmdPrint.addActionListener(new ActionListener()
			{ public void actionPerformed (ActionEvent e)
				{mnuFilePrint.doClick();}
			}
		);
		
		// Action du bouton Quitter
		cmdQuit.addActionListener(new ActionListener()
			{ public void actionPerformed (ActionEvent e)
				{mnuFileQuit.doClick();}
			}
		);
		
		// Action du bouton Couper
		cmdCut.addActionListener(new ActionListener()
			{ public void actionPerformed (ActionEvent e)
				{mnuEditCut.doClick();}
			}
		);
		
		// Action du bouton Copier
		cmdCopy.addActionListener(new ActionListener()
			{ public void actionPerformed (ActionEvent e)
				{mnuEditCopy.doClick();}
			}
		);
		
		// Action du bouton Coller
		cmdPaste.addActionListener(new ActionListener()
			{ public void actionPerformed (ActionEvent e)
				{mnuEditPaste.doClick();}
			}
		);
		
		// Action du bouton Tout Selectionner
		cmdSelectAll.addActionListener(new ActionListener()
			{ public void actionPerformed (ActionEvent e)
				{mnuEditSelectAll.doClick();}
			}
		);

		// Fermeture de la fenêtre 
		addWindowListener(new WindowAdapter() 
			{ public void windowClosing(WindowEvent e) 
				{mnuFileQuit.doClick();} 
			}
		); 		

		
		// On enregistre les composants du menu CODE disponible uniquement sur Mac OS X
        if (macOSX) {
            try {
                OSXAdapter.setQuitHandler(this, getClass().getDeclaredMethod("quit", (Class[])null));
                OSXAdapter.setAboutHandler(this, getClass().getDeclaredMethod("about", (Class[])null));
                OSXAdapter.setPreferencesHandler(this, getClass().getDeclaredMethod("preferences", (Class[])null));
            } catch (Exception e) {
                System.err.println("Error while loading the OSXAdapter:");
                e.printStackTrace();
            }
        }		

		// On donne le focus à la zone d'édition
		txtEditorZone.requestFocus();
		
	}

	/**
	* Methode pour quitter utilisée par Mac OS X
	*
	*/  	
	public boolean quit() {
		mnuFileQuit.doClick();
		// Pour indiquer qu'il ne faut pas fermer la fenêtre (la méthode
		// ci-dessus s'en occupe)
		return false;
	}

	/**
	* Methode pour avoir la boite de préférences utilisée par Mac OS X
	*
	*/  	
	public void preferences() {
		mnuEditPreferences.doClick();
	}
	
	
	/**
	* Methode pour avoir la boite a propos de utilisée par Mac OS X
	*
	*/  	
	public void about() {
		mnuHelpAbout.doClick();
	}
	
	/**
	* Methode pour créer le menu
	*
	*/  
	private void createMenu () {
		
		mnuMenuBar = new JMenuBar();
		// Mise en place menu Fichier
		mnuFile = new JMenu("Fichier");
		mnuFileNew = new JMenuItem("Nouveau");
		mnuFileNew.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, modifierKey));
		mnuFileNew.setIcon(loadIcon("ressources/menu/file-new.png"));
		mnuFile.add(mnuFileNew);
		sepMenuFile1 = new JSeparator();
		mnuFile.add(sepMenuFile1);
		mnuFileOpen = new JMenuItem("Ouvrir...");
		mnuFileOpen.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O, modifierKey));
		mnuFileOpen.setIcon(loadIcon("ressources/menu/file-open.png"));
		mnuFile.add(mnuFileOpen);
		mnuFileClose = new JMenuItem("Fermer");
		mnuFileClose.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_W, modifierKey));
		mnuFile.add(mnuFileClose);
		sepMenuFile2 = new JSeparator();
		mnuFile.add(sepMenuFile2);
		mnuFileSave = new JMenuItem("Enregistrer");
		mnuFileSave.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, modifierKey));
		mnuFileSave.setIcon(loadIcon("ressources/menu/file-save.png"));
		mnuFile.add(mnuFileSave);
		mnuFileSaveAs = new JMenuItem("Enregistrer sous...");
		mnuFileSaveAs.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.SHIFT_MASK | modifierKey));
		mnuFileSaveAs.setIcon(loadIcon("ressources/menu/file-save-as.png"));
		mnuFile.add(mnuFileSaveAs);
		sepMenuFile3 = new JSeparator();
		mnuFile.add(sepMenuFile3);
		mnuFilePrint = new JMenuItem("Imprimer...");
		mnuFilePrint.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_P, modifierKey));
		mnuFilePrint.setIcon(loadIcon("ressources/menu/file-print.png"));
		mnuFile.add(mnuFilePrint);
		sepMenuFile4 = new JSeparator();
		mnuFile.add(sepMenuFile4);
		mnuFileQuit = new JMenuItem("Quitter");
		mnuFileQuit.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Q, modifierKey));
		mnuFileQuit.setIcon(loadIcon("ressources/menu/file-quit.png"));
		mnuMenuBar.add(mnuFile);
		mnuFile.add(mnuFileQuit);
		mnuMenuBar.add(mnuFile);
		// Mise en place menu Edition
		mnuEdit = new JMenu ("Edition");
		mnuEditUndo = new JMenuItem("Annuler");
		mnuEditUndo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Z, modifierKey));
		mnuEditUndo.setIcon(loadIcon("ressources/menu/edit-undo.png"));
		mnuEdit.add(mnuEditUndo);
		mnuEditRedo = new JMenuItem("Refaire");
		mnuEditRedo.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_Y, modifierKey));
		mnuEditRedo.setIcon(loadIcon("ressources/menu/edit-redo.png"));
		mnuEdit.add(mnuEditRedo);
		sepMenuEdit1 = new JSeparator();
		mnuEdit.add(sepMenuEdit1);
		mnuEditCut = new JMenuItem("Couper");
		mnuEditCut.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_X, modifierKey));
		mnuEditCut.setIcon(loadIcon("ressources/menu/edit-cut.png"));
		mnuEdit.add(mnuEditCut);
		mnuEditCopy = new JMenuItem("Copier");
		mnuEditCopy.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C, modifierKey));
		mnuEditCopy.setIcon(loadIcon("ressources/menu/edit-copy.png"));
		mnuEdit.add(mnuEditCopy);
		mnuEditPaste = new JMenuItem("Coller");
		mnuEditPaste.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V, modifierKey));
		mnuEditPaste.setIcon(loadIcon("ressources/menu/edit-paste.png"));
		mnuEdit.add(mnuEditPaste);
		sepMenuEdit2 = new JSeparator();
		mnuEdit.add(sepMenuEdit2);
		mnuEditSelectAll = new JMenuItem("Tout sélectionner");
		mnuEditSelectAll.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_A, modifierKey));
		mnuEditSelectAll.setIcon(loadIcon("ressources/menu/edit-select-all.png"));
		mnuEdit.add(mnuEditSelectAll);
		sepMenuEdit3 = new JSeparator();
		mnuEdit.add(sepMenuEdit3);
		mnuEditPreferences = new JMenuItem("Préférences..");
		mnuEdit.add(mnuEditPreferences);
		mnuMenuBar.add(mnuEdit);
		// Mise en place menu Aide
		mnuHelp = new JMenu("Aide");
		mnuHelpAbout = new JMenuItem("A propos de CODE...");
		mnuHelp.add(mnuHelpAbout);
		mnuMenuBar.add(mnuHelp);
		
		// On attache le menu à la fenêtre
		setJMenuBar(mnuMenuBar);
	}
	
	/**
	* Methode pour créer la barre d'outil
	*
	*/  
	private void createToolBar() {
		

		toolBar = new JToolBar();
		cmdNew = new JButton();
		cmdNew.setIcon(loadIcon("ressources/toolbar/file-new.png"));
		cmdNew.setBorderPainted(false);
		cmdNew.setToolTipText(lblToolTipNew);
		cmdNew.setFocusable(false);
		toolBar.add(cmdNew);
		cmdOuvrir = new JButton();
		cmdOuvrir.setIcon(loadIcon("ressources/toolbar/file-open.png"));
		cmdOuvrir.setBorderPainted(false);
		cmdOuvrir.setToolTipText(lblToolTipOpen);
		cmdOuvrir.setFocusable(false);
		toolBar.add(cmdOuvrir);
		cmdSave = new JButton();
		cmdSave.setIcon(loadIcon("ressources/toolbar/file-save.png"));
		cmdSave.setToolTipText(lblToolTipSave);
		cmdSave.setBorderPainted(false);
		cmdSave.setFocusable(false);
		toolBar.add(cmdSave);
		cmdSaveAs = new JButton();
		cmdSaveAs.setIcon(loadIcon("ressources/toolbar/file-save-as.png"));
		cmdSaveAs.setBorderPainted(false);
		cmdSaveAs.setToolTipText(lblToolTipSaveAs);
		cmdSaveAs.setFocusable(false);
		toolBar.add(cmdSaveAs);
		cmdPrint = new JButton();
		cmdPrint.setIcon(loadIcon("ressources/toolbar/file-print.png"));
		cmdPrint.setBorderPainted(false);
		cmdPrint.setToolTipText(lblToolTipPrint);
		cmdPrint.setFocusable(false);
		toolBar.add(cmdPrint);
		sepToolBar1 = new JToolBar.Separator();
		sepToolBar1.setOrientation(SwingConstants.VERTICAL);
		toolBar.add(sepToolBar1);
		cmdCut = new JButton();
		cmdCut.setIcon(loadIcon("ressources/toolbar/edit-cut.png"));
		cmdCut.setToolTipText(lblToolTipCut);
		cmdCut.setBorderPainted(false);
		cmdCut.setFocusable(false);
		toolBar.add(cmdCut);
		cmdCopy = new JButton();
		cmdCopy.setIcon(loadIcon("ressources/toolbar/edit-copy.png"));
		cmdCopy.setToolTipText(lblToolTipCopy);
		cmdCopy.setBorderPainted(false);
		cmdCopy.setFocusable(false);
		toolBar.add(cmdCopy);
		cmdPaste = new JButton();
		cmdPaste.setIcon(loadIcon("ressources/toolbar/edit-paste.png"));
		cmdPaste.setToolTipText(lblToolTipPaste);
		cmdPaste.setBorderPainted(false);
		cmdPaste.setFocusable(false);
		toolBar.add(cmdPaste);
		cmdSelectAll = new JButton();
		cmdSelectAll.setIcon(loadIcon("ressources/toolbar/edit-select-all.png"));
		cmdSelectAll.setToolTipText(lblToolTipSelectAll);
		cmdSelectAll.setBorderPainted(false);
		cmdSelectAll.setFocusable(false);
		toolBar.add(cmdSelectAll);
		sepToolBar2 = new JToolBar.Separator();
		sepToolBar2.setOrientation(SwingConstants.VERTICAL);
		toolBar.add(sepToolBar2);
		cmdQuit = new JButton();
		cmdQuit.setIcon(loadIcon("ressources/toolbar/file-quit.png"));
		cmdQuit.setToolTipText(lblToolTipQuit);
		cmdQuit.setBorderPainted(false);
		cmdQuit.setFocusable(false);
		toolBar.add(Box.createHorizontalGlue());
		toolBar.add(cmdQuit);
		toolBar.setFloatable(false);
		contentPanel.add(toolBar, BorderLayout.NORTH);
	}
	
	/**
	* Methode pour activer/désactiver la zone de travail et les boutons
	* associés à l'édition d'un document.
	* 
	* @param val true si un document est ouvert, false si aucun document n'est ouvert
	*
	*/  
	private void setWorkspaceActive(Boolean val) {
		
		if (val) {
			txtEditorZone.setEnabled(true);
			txtEditorZone.setBackground(Color.WHITE);
		}	
		else {
			// La zone d'édition est désactivée
			txtEditorZone.setText("");
			txtEditorZone.setEnabled(val);
			txtEditorZone.setBackground(Color.GRAY);
		}
		
		// On active/désactive le menus et boutons d'éditions de document
		mnuFileClose.setEnabled(val);
		mnuFileSave.setEnabled(val);
		cmdSave.setEnabled(val);
		mnuFileSaveAs.setEnabled(val);
		cmdSaveAs.setEnabled(val);
		mnuFilePrint.setEnabled(val);
		cmdPrint.setEnabled(val);
		mnuEditUndo.setEnabled(val);
		mnuEditRedo.setEnabled(val);
		mnuEditCut.setEnabled(val);
		cmdCut.setEnabled(val);
		mnuEditCopy.setEnabled(val);
		cmdCopy.setEnabled(val);
		mnuEditPaste.setEnabled(val);
		cmdPaste.setEnabled(val);
		mnuEditSelectAll.setEnabled(val);
		cmdSelectAll.setEnabled(val);
	}
	
	/**
	* Methode statique pour charger une image d'icone sur n'importe quel systeme
	*
	* @param path Le nom complet du fichier
	* @return L'image sous forme de ImageIcon
	*/   
	private static ImageIcon loadIcon (String path) {
		ClassLoader cl = ClassLoader.getSystemClassLoader();
		URL url = cl.getResource(path);
		return new ImageIcon(url);
	}
	
	
	/**
	* Renvoie la zone texte d'édition
	*
	* @return La zone texte d'edition
	*/   
	public JColoredTextZone getTxtEditorZone () {
		return txtEditorZone;
	}
	
	/**
	* Vérifie si un fichier a été modifier et retrourne le choix de l'utilisateur 
	*
	* @return Retourne le choix de l'utilisateur: Enregistrer, Ne Pas Enregister ou Annuler
	*/   	
	private String userChoice() {
		// Choix si il y a eu une modification dans le fichier
		String choice = notSave;
		// Si il y a eu une modification dans le fichier
		if (controller.fileModification(txtEditorZone.getText())) {
			// Demande à l'utilisateur s'il veut sauvegarder le fichier
			choice = JFileDialogBox.FileConfirmationBox(txtEditorZone, controller.getPathOfFile());
			// Enregistrer le fichier
			if (choice.equals(save)) {
				mnuFileSave.doClick();
			}
		}	
		return choice;
	}
	
}
